from math import radians, sin, cos, sqrt, asin


def haversine(lon1, lat1, lon2, lat2):
    """
    计算两组经纬度之间的球面距离（单位：公里）
    参数:
        lon1, lat1: 第一个点的经度和纬度
        lon2, lat2: 第二个点的经度和纬度
    """
    # 将经纬度从度转换为弧度
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # Haversine公式
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))

    # 地球半径（单位：公里）
    r = 6371
    return c * r * 1000

if __name__ == "__main__":
    # 示例：计算北京(116.404, 39.915)和上海(121.474, 31.230)的距离
    distance_km = haversine(103.78778453035158, 29.752473091966592, 103.78777453035158, 29.752673091966592)
    print(f"北京到上海的距离: {distance_km:.2f} 米")
    # 输出: 北京到上海的距离: 1068.90 公里


